import { z } from 'zod';

// 创建菜单的验证 schema
export const createMenuSchema = z.object({
  menuName: z.string().min(2, '菜单名称至少需要2个字符').max(50, '菜单名称最多50个字符'),
  parentId: z.number().int().default(0),
  orderNum: z.number().int().default(0),
  path: z.string().max(200, '路由地址最多200个字符').default(''),
  component: z.string().max(255, '组件路径最多255个字符').optional(),
  query: z.string().max(255, '路由参数最多255个字符').default(''),
  isFrame: z.enum(['0', '1']).default('1'), // 1-是, 0-否
  isCache: z.enum(['0', '1']).default('0'), // 1-是, 0-否
  menuType: z.enum(['M', 'C', 'F']).default('M'), // M-目录, C-菜单, F-按钮
  visible: z.enum(['0', '1']).default('0'), // 0-显示, 1-隐藏
  status: z.enum(['0', '1']).default('0'), // 0-正常, 1-停用
  perms: z.string().max(100, '权限标识最多100个字符').default(''),
  icon: z.string().max(100, '菜单图标最多100个字符').default(''),
  remark: z.string().max(500, '备注最多500个字符').optional(),
});

// 更新菜单的验证 schema
export const updateMenuSchema = z.object({
  menuName: z.string().min(2, '菜单名称至少需要2个字符').max(50, '菜单名称最多50个字符').optional(),
  parentId: z.number().int().optional(),
  orderNum: z.number().int().optional(),
  path: z.string().max(200, '路由地址最多200个字符').optional(),
  component: z.string().max(255, '组件路径最多255个字符').optional(),
  query: z.string().max(255, '路由参数最多255个字符').optional(),
  isFrame: z.enum(['0', '1']).optional(),
  isCache: z.enum(['0', '1']).optional(),
  menuType: z.enum(['M', 'C', 'F']).optional(),
  visible: z.enum(['0', '1']).optional(),
  status: z.enum(['0', '1']).optional(),
  perms: z.string().max(100, '权限标识最多100个字符').optional(),
  icon: z.string().max(100, '菜单图标最多100个字符').optional(),
  updateBy: z.string().max(64, '更新者最多64个字符').optional(),
  remark: z.string().max(500, '备注最多500个字符').optional(),
}).refine(data => Object.keys(data).length > 0, {
  message: '至少需要提供一个字段进行更新',
});

// 参数验证 schema
export const paramSchema = z.object({
  id: z.string().refine((val) => !isNaN(Number(val)), {
    message: 'ID 必须是数字',
  }),
});

// 导出类型
export type CreateMenuDto = z.infer<typeof createMenuSchema>;
export type UpdateMenuDto = z.infer<typeof updateMenuSchema>;
export type ParamDto = z.infer<typeof paramSchema>; 